Handle JSON and XML 处理 JSON 和 XML

一个 POJO 对象

为了项目更加清晰,我们建立 com.waylau.rest.bean,在该包下面创建一个 POJO 对象 MyBean:

  1. public class MyBean {
  2. private String name;
  3. private int age;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public int getAge() {
  11. return age;
  12. }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. }

JSON 处理

我们想把这个对象返回给客户端,在 MyResource 资源下,写了

  1. /**
  2. * 方法处理 HTTP GET 请求。返回的对象以"application/json"媒体类型
  3. * 给客户端
  4. *
  5. * @return MyPojo 以 application/json 形式响应
  6. */
  7. @GET
  8. @Path("pojojson")
  9. @Produces(MediaType.APPLICATION_JSON)
  10. public MyBean getPojoJson() {
  11. MyBean pojo = new MyBean();
  12. pojo.setName("waylau.com");
  13. pojo.setAge(28);
  14. return pojo;
  15. }

其中 @Produces(MediaType.APPLICATION_XML)意思是以 JSON 形式将对象返回给客户端。

在 index.jsp 里面,我们写了一个调用该 API 的方法

  1. <p><a href="webapi/myresource/pojojson">POJO JSON</a>

启动项目,点击“POJO JSON”,后台提示如下错误

  1. org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
  2. SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.waylau.rest.bean.MyPojo, genericType=class com.waylau.rest.bean.MyPojo.

那是因为 POJO 对象未被序列化成 JSON 对象,所以找不到,下面介绍几种常用的序列化手段。

采用 MOXy

需要添加 jersey-media-moxy 依赖库在你的 pom.xml 来使用 MOXy

  1. <dependency>
  2. <groupId>org.glassfish.jersey.media</groupId>
  3. <artifactId>jersey-media-moxy</artifactId>
  4. </dependency>

由于 JSON 绑定特性是在自动发现的列表里,所以无需再注册该特性就使用了。(关于“自动发现”,详见《Jersey 2.x 用户指南》“4.3.自动发现的特性”一节)

启动项目,点击“POJO JSON”,页面输出

  1. {"age":28,"name":"waylau.com"}

6. Handle JSON and XML 处理 JSON 和 XML - 图1

采用 Jackson (2.x)

使用 Jackson 2.x 需添加 jersey-media-json-jackson 模块到 pom.xml:

  1. <dependency>
  2. <groupId>org.glassfish.jersey.media</groupId>
  3. <artifactId>jersey-media-json-jackson</artifactId>
  4. </dependency>

XML 处理

我们想把这个对象返回给客户端,在 MyResource 资源下,写了

  1. /**
  2. * 方法处理 HTTP GET 请求。返回的对象以"application/xml"媒体类型
  3. * 给客户端
  4. *
  5. * @return MyPojo 以 application/xml 形式响应
  6. */
  7. @GET
  8. @Path("pojoxml")
  9. @Produces(MediaType.APPLICATION_XML)
  10. public MyBean getPojoXml() {
  11. MyBean pojo = new MyBean();
  12. pojo.setName("waylau.com");
  13. pojo.setAge(28);
  14. return pojo;
  15. }

其中 @Produces(MediaType.APPLICATION_XML)意思是以 XML 形式将对象返回给客户端

在 index.jsp 里面,我们写了一个调用该 API 的方法

  1. <p><a href="webapi/myresource/pojoxml">POJO XML</a>

启动项目,点击“POJO XML”,后台提示如下错误

  1. org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
  2. SEVERE: MessageBodyWriter not found for media type=application/xml, type=class com.waylau.rest.bean.MyPojo, genericType=class com.waylau.rest.bean.MyPojo.

那是因为 POJO 对象未被序列化成 XML 对象,所以找不到,解决方法很简单,在 MyBean 上面加上@XmlRootElement注解即可

  1. @XmlRootElement
  2. public class MyBean {
  3. private String name;
  4. private int age;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. }

@XmlRootElement 作用是将一个类或一个枚举类型映射为一个 XML 元素。

再次启动项目,点击“POJO XML”,显示正常

6. Handle JSON and XML 处理 JSON 和 XML - 图2

源码

handle-json-xml项目。